const data = require('./data.json')
const fs = require('fs');
const WebSocket = require('ws');
// 创建WebSocket服务器，监听指定的端口
const wss = new WebSocket.Server({ port: 8080 });
const user = new Set()
// 监听连接建立的事件
wss.on('connection', function (socket) {
  console.log('WebSocket连接已建立');
  // 监听接收到消息的事件
  socket.on('message', function (message) {
    console.log('接收到消息：', JSON.parse(message.toString()).id)
    //创建房间
    if (JSON.parse(message.toString()).type == '创建' || JSON.parse(message.toString()).type == '加入') createHome(message, socket)
    //接收棋盘的所有棋子对象
    if (JSON.parse(message.toString()).code == 'pieces') {
      console.log(JSON.parse(message.toString()));
      socket.send(JSON.stringify({ code: 'pieces', pieces: JSON.parse(message.toString()).pieces }));
    }
    socket.send('收到了基本消息');

  });

  // 监听连接关闭的事件
  socket.on('close', function () {
    console.log('WebSocket连接已关闭');
  });

  // 监听连接错误的事件
  socket.on('error', function (error) {
    console.error('WebSocket连接发生错误：', error);
  });
});







function createHome (message, socket) {


  //创建房间
  fs.readFile('./src/nodejs/data.json', 'utf8', (err, data) => {
    if (err) {
      console.error(err);
      return;
    }
    // JSON文件的内容在data变量中
    const jsonData = JSON.parse(data);
    if (JSON.parse(message.toString()).type == '创建') {
      //判断当前房间是否存在
      if (jsonData.some(item => item.id == JSON.parse(message.toString()).id)) return socket.send(JSON.stringify({ code: 'sORj', message: '房间已存在' }));
      // 修改jsonData对象的属性值
      jsonData.push({ id: JSON.parse(message.toString()).id, count: 1 })
      distribute(jsonData, JSON.parse(message.toString()).id)
      // 将修改后的jsonData对象转换回JSON字符串
      const updatedData = JSON.stringify(jsonData);
      // 使用fs.writeFile方法写入更新后的数据到JSON文件
      fs.writeFile('./src/nodejs/data.json', updatedData, 'utf8', (err) => {
        if (err) {
          console.error(err);
          return;
        }
        console.log('JSON文件已成功更新。');

        socket.send(JSON.stringify({ code: 'sORj', message: '创建成功', data: jsonData.filter(item => item.id == JSON.parse(message.toString()).id)[0] }));
      });
    } else {
      //加入房间
      let count = 0
      //筛选出房间id的对象
      jsonData.forEach(item => {
        if (item.id == JSON.parse(message.toString()).id) {
          item.count++
          count = item.count
          item.b.socket = socket
        }

      })
      //判断当前房间是否存在
      if (!jsonData.some(item => item.id == JSON.parse(message.toString()).id)) return socket.send(JSON.stringify({ code: 'sORj', message: '房间不存在' }));
      if (count != 2) return socket.send(JSON.stringify({ code: 'sORj', message: '房间已满' }));
      // 将修改后的jsonData对象转换回JSON字符串
      const updatedData = JSON.stringify(jsonData);
      // 使用fs.writeFile方法写入更新后的数据到JSON文件
      fs.writeFile('./src/nodejs/data.json', updatedData, 'utf8', (err) => {
        if (err) {
          console.error(err);
          return;
        }
        console.log('JSON文件已成功更新。');

        jsonData.filter(item => item.id == JSON.parse(message.toString()).id)[0].a.socket.send(JSON.stringify({
          code: 'sORj',
          message: '创建成功',
          data: jsonData.filter(item => item.id == JSON.parse(message.toString()).id)[0]
        }));
        jsonData.filter(item => item.id == JSON.parse(message.toString()).id)[0].b.socket.send(JSON.stringify({
          code: 'sORj',
          message: '加入成功',
          data: jsonData.filter(item => item.id == JSON.parse(message.toString()).id)[0]
        }));
      });

    }

  });



}

//分配黑白棋手
function distribute (arr, id) {
  arr.forEach(item => {
    if (item.id == id) {
      if (item.count == 1) {
        item.a = { type: ['h', 'b'][Math.floor(Math.random() * 2)], name: generateRandomUsername() }
        item.b = { type: item.a.type == 'h' ? 'b' : 'h', name: generateRandomUsername() }
      }

    }
  })


}



// 随机生成用户名
function generateRandomUsername () {
  const adjectives = ['李', '张', '王', '老', '大', '小', '齐', 'giao', '坤', '狂'];
  const nouns = ['狗', '13', '鸡', '坤', '眼子', '壶', 'giao', '儿子', '爸', '孙'];

  const randomAdjective = adjectives[Math.floor(Math.random() * adjectives.length)];
  const randomNoun = nouns[Math.floor(Math.random() * nouns.length)];

  return randomAdjective + randomNoun;
}

